﻿// See https://aka.ms/new-console-template for more information
var obj = return123();

Console.WriteLine("阻塞");

//var obj =await return123();
//谨慎使用await，如果使用异步方法，但是却在一开始就用await等待，那么异步方法运行与同步无异
//因此正确的使用方式是一开始调用异步方法，在需要使用异步方法返回值的时候再进行await
//在使用async/await的异步编程中，调用方调用一个异步方法，只有进到异步方法内部，遇见第一个await时才能判断这是异步方法，才会回到主线程。
var s =await obj;
Console.WriteLine(s);


//在使用async/await的异步编程中，调用方调用一个异步方法，只有进到异步方法内部，遇见第一个await时才能判断这是异步方法，才会回到调用方，继续运行调用方的代码。
async Task<int> return123()
{
    await Task.Delay(20);//await出现在异步方法的最开头，因此当调用方进入到次方法时遇见第一个await便会马上返回
    Console.WriteLine(123);
    Console.WriteLine(456);
    //await Task.Delay(20);
    return await Task.FromResult(123);
}



//Task.Delay()和Thread.Sleep()的区别
//Task.Delay()是异步的，他会创建一个延迟任务，该任务会在指定的时间后回复当前线程的执行。在等待期间，当前线程可以执行其他任务，因此，Task.Delay()不会阻塞当前线程。
//Thread.Sleep()是同步的，他会暂停当前线程的执行，指导指定的时间过去。在等待期间，当前线程无法执行其他任务，因此，Thread.Sleep()会阻塞当前线程。
//总的来说，Task.Delay()更适合异步编程中使用，而Thread.Sleep更适合在同步编程中使用。